#include "mainscence.h"
#include "ui_mainscence.h"
#include"config.h"
#include<QIcon>
#include"map.h"
#include<QPainter>
#include<QMouseEvent>
#include<ctime>
#include<QSound>

Mainscence::Mainscence(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Mainscence)
{
    ui->setupUi(this);//顺序怎么办？

    initScene();//调用初始化场景函数
    //启动游戏，调用启动游戏函数
    playGame();
}

Mainscence::~Mainscence()
{
    delete ui;
}
void Mainscence::playGame()
{
    //启动背景音乐（有先后顺序）
    QSound::play(SOUND_BACKGROUND);//需要QSound头文件

    //启动定时器
    m_Timer.start();

    //监听定时器发送的信号(槽)//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!槽和信号，可以实现更新的东西
    connect(&m_Timer , &QTimer::timeout,[=](){
        //敌机出场
        enemyToScene();
        //更新游戏中元素的坐标
        updatePosition();
        //绘制到主屏幕中
        update();//系统自带主函数（重新绘制游戏窗口中所有信息）
        collisionDetection();
    });

}

void Mainscence::updatePosition()//让画面动起来的东西
{
    //更新地图坐标
    m_map.mapPosition();

    //测试子弹
   // temp_Bullet.m_Free = false;
   // temp_Bullet.updatePosition();

    //发射子弹
    m_hero.shoot();

    //计算所有非空闲子弹的当前坐标（让子弹飞起来）
    for(int i=0;i<BULLET_NUM;i++)
    {
        //如果非空闲，需要更新这个子弹的坐标
        if(m_hero.m_bullets[i].m_Free==false)
        {
            m_hero.m_bullets[i].updatePosition();//此处仅更新了坐标，没有绘制
        }
    }

    //敌机出场
    for(int i=0;i<ENEMY_NUM;i++)
    {
        if(m_enemys[i].m_Free == false)//空闲敌机出场
        {
            m_enemys[i].updatePosition();
        }
    }

    //计算爆炸播放图片
    for(int i=0;i<BOMB_NUM;i++)
    {
        if(m_bombs[i].m_Free==false)
        {
            m_bombs[i].updateInfo();//没太看明白？？？？？？？？？？？？//还需要绘制//图片下标会在此时更新
        }
    }
}

void Mainscence::paintEvent(QPaintEvent *)
{
    QPainter painter(this);//要在当前屏幕（this）中画画
    //绘制地图
    painter.drawPixmap(0,m_map.m_map1_posY,m_map.m_map1);//初始坐标为0，末坐标随map1变动
    painter.drawPixmap(0,m_map.m_map2_posY,m_map.m_map2);

    //绘制英雄飞机
    painter.drawPixmap(m_hero.m_X, m_hero.m_Y, m_hero.m_Plane);

    //绘制测试子弹
   // painter.drawPixmap(temp_Bullet.m_X,temp_Bullet.m_Y,temp_Bullet.m_Bullet);

    //绘制子弹
   for(int i=0;i<BULLET_NUM;i++)
   {
       //如果非空闲，绘制
       if(m_hero.m_bullets[i].m_Free==false)
      painter.drawPixmap(m_hero.m_bullets[i].m_X,m_hero.m_bullets[i].m_Y,m_hero.m_bullets[i].m_Bullet);
   }

   //绘制敌机
   for(int i=0;i<ENEMY_NUM;i++)
   {
       if(m_enemys[i].m_Free == false)
       {
           painter.drawPixmap(m_enemys[i].m_X,m_enemys[i].m_Y,m_enemys[i].m_enemy);
       }
   }


   //绘制爆炸
   for(int i=0;i<BOMB_NUM;i++)
   {
       if(m_bombs[i].m_Free==false)
       {
           painter.drawPixmap(m_bombs[i].m_X,m_bombs[i].m_Y,m_bombs[i].m_pixArr[m_bombs[i].m_index]);//实现绘制轮番播放的贴图
       }
   }
}

void Mainscence::mouseMoveEvent(QMouseEvent * event)//需有<QMouseEvent>头文件
{
    //记录鼠标点击的位置
    int x = event->x() - m_hero.m_Rect.width()*0.5;
    int y = event->y() - m_hero.m_Rect.height()*0.5;

    //边界检测
    if(x<=0)
    {
        x=0;
    }
    if(x>=GAME_WIDTH-m_hero.m_Rect.width())
    {
        x=GAME_WIDTH-m_hero.m_Rect.width();
    }
    if(y<=0)
    {
        y = 0;
    }
    if(y >= GAME_HEIGHT - m_hero.m_Rect.height())
    {
        y=GAME_HEIGHT - m_hero.m_Rect.height();
    }
    m_hero.setPosition(x,y);//用于将飞机移到相应位置
}

void Mainscence::enemyToScene()
{
    m_recorder++;
    //未到出场时间，直接return
    if(m_recorder < ENEMY_INTERNAL)
    {
        return;
    }

    m_recorder = 0;
    for(int i=0;i<ENEMY_NUM;i++)
    {
        //如果是空闲敌机，出场
        if(m_enemys[i].m_Free)
        {
            m_enemys[i].m_Free = false;

            //出现点坐标（随机）
            m_enemys[i].m_X = rand()%(GAME_WIDTH-m_enemys[i].m_Rect.width());//伪随机
            m_enemys[i].m_Y = -m_enemys[i].m_Rect.height();//肯定在屏幕最上方出场
            break;//为啥？？但是必须有

        }
    }
}

void Mainscence::collisionDetection()//子弹和飞机
{
    //遍历所有非空闲敌机
    for(int i=0;i<ENEMY_NUM;i++)
    {
        if(m_enemys[i].m_Free)
        {
            continue;//一个一个找
        }
        //遍历所有非空闲子弹
        for(int j=0;j<BULLET_NUM;j++)
        {
            if(m_hero.m_bullets[j].m_Free)
            {
                continue;//一个一个找到
            }
            //如果子弹和飞机相交，碰撞，二者均变空闲
            if(m_enemys[i].m_Rect.intersects(m_hero.m_bullets[j].m_Rect))//???????????????????没看懂这什么啥
            {
                m_enemys[i].m_Free = true;
                m_hero.m_bullets[j].m_Free = true;

                //播放爆炸效果
               for(int i=0;i<BOMB_NUM;i++)
               {
                   if(m_bombs[i].m_Free)
                   {
                       //播放爆炸音效
                       QSound::play(SOUND_BOMB);
                       //空闲爆炸，可以播放爆炸
                       m_bombs[i].m_Free=false;
                       //更新爆炸坐标
                       m_bombs[i].m_X=m_enemys[i].m_X;
                        m_bombs[i].m_Y=m_enemys[i].m_Y;
                        break;
                   }
               }
            }
        }
    }
}

void Mainscence::initScene()//初始化场景
{
    //设置窗口固定尺寸

    setFixedSize(GAME_WIDTH,GAME_HEIGHT);//后期大小只需在h文件中修改即可
    //设置标题
    setWindowTitle(GAME_TITLE);

    //加载图标
    setWindowIcon(QIcon(GAME_ICON));

    //定时器初始化
    m_Timer.setInterval(GAME_RATE);

    //敌机出场时间间隔 初始化
    m_recorder = 0;

    //随机数种子
    srand((unsigned int)time(NULL));
}



